home *** CD-ROM | disk | FTP | other *** search
/ Micromanía 90 / CDMM_90_1.ISO / Cycling Manager 2 / CyclingManager2Demo.exe / Disk1 / data1.cab / Game / DataCM2 / scripts / elements / sliders.cnh < prev    next >
Encoding:
Text File  |  2002-05-10  |  27.3 KB  |  1,049 lines

  1. // sliders.cnh
  2.  
  3. // -------------------------------------------------------------
  4. // Constructors
  5. // -------------------------------------------------------------
  6.  
  7. // Init func Predeclaration
  8. func Gui_Component NewSliderH(Menu_Material _pSlide,i32x _iSize);
  9. func Gui_Component NewSliderV(Menu_Material _pSlide,i32x _iSize);
  10. func Gui_Component NewSliderCompositeV(Menu_Material _pSlide,i32x _iSize, Menu_Material _pUpButton, Menu_Material _pDownButton, Menu_Material _pTexture);
  11. // Message
  12. message SldChange(Gui_Component _pthis,f32x _fValue);
  13. message SldValue(f32x _fValue);
  14. message QuietSldValue(f32x _fValue);
  15. message SldParam(f32x _fMin,f32x _fMax,f32x _fStep);
  16. message SldSize(i32x _iSize);
  17. message SldPosition(i32x _iPosition);
  18.  
  19. // -------------------------------------------------------------
  20. // -------------------------------------------------------------
  21.  
  22. // Standard sliders
  23. // Data class
  24. class Gui_dtSlider
  25. {
  26.     var f32x fValue; // current value
  27.     var f32x fMin;    // min value
  28.     var f32x fMax;    // max value
  29.     var f32x fStep;    // minimum step
  30.     var i32x iSize;    // slider pixel amplitude movement
  31.     var i32x bDrag;    // true when slide is drag by mouse
  32.     var i32x iDragOffset;    // pix offset for slide drag
  33.     // Optim
  34.     var i32x iSldSize;    // slider size in pixel
  35.     var f32x fCoef; // Pix/value coef
  36. };
  37.  
  38. class Gui_dtSliderComposite
  39. {
  40.     // gui element
  41.     var Gui_Component gcUpOrLeftButton;
  42.     var Gui_Component gcDownOrRightButton;
  43.     var Gui_Component gcTexture;
  44.     var Gui_Component gcSlider;
  45.  
  46.     // var
  47.     var boolx bMouseDown;
  48.     var f32x fMove;
  49. };
  50.  
  51. // Predeclaration
  52. func void Slider_OnEnter(i32x _iX,i32x _iY);
  53. func void Slider_OnLeave(i32x _iX,i32x _iY);
  54. func i32x SliderH_OnMouseDown(i32x _iX,i32x _iY,i32x _iButton);
  55. func i32x SliderV_OnMouseDown(i32x _iX,i32x _iY,i32x _iButton);
  56. func i32x Slider_OnMouseUp(i32x _iX,i32x _iY,i32x _iButton);
  57. func i32x SliderH_OnMouseMove(i32x _iX,i32x _iY);
  58. func i32x SliderV_OnMouseMove(i32x _iX,i32x _iY);
  59. func i32x SliderV_OnMouseRoll(i32x _iX,i32x _iY,i32x _iZ);
  60. //func i32x Slider_OnKeyDown(i32x _iKey,i32x _iCount);
  61. //func i32x Slider_OnKeyUp(i32x _iKey);
  62. func i32x Slider_OnGainFocus();
  63.  
  64. func void SliderH_SetValue(f32x _fValue);
  65. func void SliderH_QuietSldValue(f32x _fValue);
  66. func void SliderV_SetValue(f32x _fValue);
  67. func void SliderV_QuietSldValue(f32x _fValue);
  68. func void Slider_SetParam(f32x _fMin,f32x _fMax,f32x _fStep);
  69. func void SliderH_SetSize(i32x _iSize);
  70. func void SliderV_SetSize(i32x _iSize);
  71.  
  72. func void SliderH_SetPosition(i32x _iPosition);
  73. func void SliderV_SetPosition(i32x _iPosition);
  74. func i32x Slider_iComputePosition(Gui_dtSlider _pdtSlider,f32x _fValue);
  75.  
  76. func void SliderComposite_SldChange(Gui_Component _pthis,f32x _fValue);
  77. func i32x SliderCompositeV_OnClickDown(Gui_Component _pComponent);
  78. func i32x SliderCompositeH_OnClickDown(Gui_Component _pComponent);
  79. func void SliderCompositeH_SetSize(i32x _iSize);
  80. func void SliderCompositeV_SetSize(i32x _iSize);
  81.  
  82. func i32x SliderCompositeH_OnLoop(f32x _fDelta);
  83. func i32x SliderCompositeV_OnLoop(f32x _fDelta);
  84. func void SliderCompositeH_OnMouseUp(Gui_Component _pComponent);
  85. func void SliderCompositeV_OnMouseUp(Gui_Component _pComponent);
  86.  
  87. // Message handling interface
  88. interface Gui_iSliderH
  89. {
  90.     // Gui System Messages
  91. //    Slider_OnKeyUp        KeyUp;
  92. //    Slider_OnKeyDown    KeyDown;
  93.     Slider_OnEnter        MouseEnter;
  94.     Slider_OnLeave        MouseLeave;
  95.     SliderH_OnMouseMove    MouseMove;
  96.     SliderH_OnMouseDown    MouseDown;
  97.     Slider_OnMouseUp    MouseUp;
  98. //    Slider_OnMouseRoll    MouseRoll
  99.     Slider_OnGainFocus    GainFocus;
  100.  
  101.     // Slider messsage
  102.     SliderH_SetValue        SldValue;
  103.     SliderH_QuietSldValue        QuietSldValue;
  104.     Slider_SetParam        SldParam;
  105.     SliderH_SetSize        SldSize;
  106.     SliderH_SetPosition SldPosition;
  107. }
  108. interface Gui_iSliderV
  109. {
  110.     // Gui System Messages
  111. //    Slider_OnKeyUp        KeyUp;
  112. //    Slider_OnKeyDown    KeyDown;
  113.     Slider_OnEnter        MouseEnter;
  114.     Slider_OnLeave        MouseLeave;
  115.     SliderV_OnMouseMove    MouseMove;
  116.     SliderV_OnMouseDown    MouseDown;
  117.     Slider_OnMouseUp    MouseUp;
  118.     SliderV_OnMouseRoll    MouseRoll;
  119.     Slider_OnGainFocus    GainFocus;
  120.  
  121.     // Slider messsage
  122.     SliderV_SetValue        SldValue;
  123.     SliderV_QuietSldValue        QuietSldValue;
  124.     Slider_SetParam        SldParam;
  125.     SliderV_SetSize        SldSize;
  126.     SliderV_SetPosition SldPosition;
  127. }
  128.  
  129. interface Gui_iSliderCompositeV
  130. {    
  131.     SliderCompositeV_OnClickDown    ClickDown;
  132.     SliderCompositeV_SetSize        SldSize;
  133.     SliderComposite_SldChange        SldChange;
  134. }
  135.  
  136. interface Gui_iSliderCompositeH
  137. {    
  138.     SliderCompositeH_OnClickDown    ClickDown;
  139.     SliderCompositeH_SetSize        SldSize;
  140.     SliderComposite_SldChange        SldChange;
  141. }
  142.  
  143. interface Gui_iSliderCompositeV_Loop
  144. {
  145.     SliderCompositeV_OnLoop            Loop;
  146.  
  147.     SliderCompositeV_OnMouseUp    ClickUp;
  148.     SliderComposite_SldChange    SldChange;
  149. }
  150.  
  151. interface Gui_iSliderCompositeH_Loop
  152. {
  153.     SliderCompositeH_OnLoop                Loop;
  154.     
  155.     SliderCompositeH_OnMouseUp    ClickUp;
  156.     SliderComposite_SldChange    SldChange;
  157. }
  158.  
  159. /*
  160.  *    Function        : Slider constructor
  161.  *    Parameters        : _pMaterial material pointer
  162.  */
  163. func Gui_Component NewSliderH(Menu_Material _pSlide,i32x _iSize)
  164. {
  165.     var Menu_Sprite sprite;
  166.     var Gui_Component container;
  167.     var Gui_dtSlider pdtSlider;
  168.     var f32x sx,sy,f;
  169.     var i32x iArea;
  170.  
  171.     // Create container with button interface
  172.     container = NewContainer(Gui_iSliderH);
  173.     CatchEvent(container,e_GUI_Event_Mouse_Move);
  174.  
  175.     // Create new data structure
  176.     pdtSlider = new Gui_dtSlider;
  177.     SetData(container,pdtSlider);
  178.  
  179.     // Create a sprite with material and area index e_GUI_State_Enabled
  180.     sprite = NewSprite2D(_pSlide);
  181.     iArea = e_GUI_State_Enabled;
  182.     SetArea(sprite,iArea);
  183.  
  184.     // Get size of area of index e_GUI_State_Enabled
  185.     sx = GetAreaWidth(_pSlide,iArea);
  186.     sy = GetAreaHeight(_pSlide,iArea);
  187.  
  188.     // Init data
  189.     f=_iSize;
  190.     f=f-sx;
  191.     pdtSlider.iSize = f+0.5; // minimum size
  192.     pdtSlider.fMin = 0.0; // minimum value
  193.     pdtSlider.fMax = 1.0; // maximum value
  194.     pdtSlider.fValue = 1.0;
  195.     pdtSlider.fCoef = f/(pdtSlider.fMax-pdtSlider.fMin);
  196.     pdtSlider.fStep = 1.0/pdtSlider.fCoef; // default step
  197.     pdtSlider.bDrag = false;
  198.     pdtSlider.iDragOffset = 0;
  199.     pdtSlider.iSldSize = sx+0.5;
  200. //    Slider_SetValue(pdtSlider.fMin);
  201.  
  202.     // Strech container to area size
  203.     StretchTo(container,_iSize,sy);
  204.  
  205.     // Define align center/center
  206.     SetAlign(container,e_GUI_HAlign_Center,e_GUI_VAlign_Center);
  207.  
  208.     // Attach the sprite to this container
  209.     AttachSprite(container,sprite);
  210.  
  211.     // init slider position
  212.     container<<SldValue(0.0);
  213.  
  214.     return container;
  215. }
  216.  
  217. func Gui_Component NewSliderCompositeV(Menu_Material _pSlide,i32x _iSize, Menu_Material _pUpButton, Menu_Material _pDownButton, Menu_Material _pTexture)
  218. {
  219.     var Menu_Sprite sprite;
  220.     var Gui_Component composite;
  221.     var Gui_dtSliderComposite pdtSlider;
  222.     var f32x sx_slider,sy_slider,f, sy_button, sx_button;
  223.     var i32x iArea;
  224.  
  225.     // Create an object that will contain Bitmap buttons + slider
  226.     composite = NewObject(Gui_iSliderCompositeV);
  227.  
  228.     // three component in composite slider
  229.     SetComponentNumber(composite,4);
  230.  
  231.     // Create new data structure
  232.     pdtSlider = new Gui_dtSliderComposite;
  233.     SetData(composite,pdtSlider);
  234.  
  235.     // create button
  236.     pdtSlider.gcUpOrLeftButton = NewButtonDyn(_pUpButton); 
  237.     pdtSlider.gcDownOrRightButton = NewButtonDyn(_pDownButton); 
  238.     sy_button = SizeY(pdtSlider.gcUpOrLeftButton);
  239.     sx_button = SizeX(pdtSlider.gcUpOrLeftButton);
  240.     // stretch button
  241.     StretchTo(pdtSlider.gcUpOrLeftButton,sx_button,sy_button);
  242.     StretchTo(pdtSlider.gcDownOrRightButton,sx_button,sy_button);
  243.     MoveTo(pdtSlider.gcDownOrRightButton,0,_iSize-sy_button);
  244.  
  245.     // Create background texture
  246.     pdtSlider.gcTexture = NewBitmap(smWhite,0);
  247.     SetAlign(pdtSlider.gcTexture,e_GUI_HAlign_Zoom,e_GUI_VAlign_Zoom);
  248.     StretchTo(pdtSlider.gcTexture,2.0*g_fScreenScaleFactor,(_iSize-(2.0*sy_button+0.5)));
  249.     MoveTo(pdtSlider.gcTexture,(sx_button/2),sy_button);
  250.     // Disable texture
  251.     pdtSlider.gcTexture<<Disable();
  252.  
  253.     // Create container with button interface
  254.     pdtSlider.gcSlider = NewSliderV(_pSlide,(_iSize-((2.0*sy_button)+0.5)));
  255.     var f32x fPosX;
  256.     fPosX = (sx_button-SizeX(pdtSlider.gcSlider))/2;
  257.     MoveTo(pdtSlider.gcSlider, fPosX, sy_button);
  258.  
  259.     // Get size of area of index e_GUI_State_Enabled
  260.     sx_slider = SizeX(pdtSlider.gcSlider);
  261.     sy_slider = SizeY(pdtSlider.gcSlider);
  262.  
  263.     MoveTo(pdtSlider.gcSlider,(sx_button-sx_slider)/2.0,sy_button);
  264.  
  265.     // Strech container to area size
  266.     if (sx_slider < sx_button) 
  267.         sx_slider = sx_button;
  268.     StretchTo(composite,sx_slider,_iSize);
  269.  
  270.     // Mount
  271.     MountComponent(composite,pdtSlider.gcUpOrLeftButton);
  272.     MountComponent(composite,pdtSlider.gcDownOrRightButton);
  273.     MountComponent(composite,pdtSlider.gcTexture);
  274.     MountComponent(composite,pdtSlider.gcSlider);
  275.  
  276.     return composite;
  277. }
  278.  
  279. func Gui_Component NewSliderCompositeH(Menu_Material _pSlide,i32x _iSize, Menu_Material _pUpButton, Menu_Material _pDownButton, Menu_Material _pTexture)
  280. {
  281.     var Menu_Sprite sprite;
  282.     var Gui_Component composite;
  283.     var Gui_dtSliderComposite pdtSlider;
  284.     var f32x sx_slider,sy_slider,f, sy_button, sx_button;
  285.     var i32x iArea;
  286.  
  287.     // Create an object that will contain Bitmap buttons + slider
  288.     composite = NewObject(Gui_iSliderCompositeH);
  289.  
  290.     // three component in composite slider
  291.     SetComponentNumber(composite,4);
  292.  
  293.     // Create new data structure
  294.     pdtSlider = new Gui_dtSliderComposite;
  295.     SetData(composite,pdtSlider);
  296.  
  297.     // create button
  298.     pdtSlider.gcUpOrLeftButton = NewButtonDyn(_pUpButton); 
  299.     pdtSlider.gcDownOrRightButton = NewButtonDyn(_pDownButton); 
  300.     sy_button = SizeY(pdtSlider.gcUpOrLeftButton);
  301.     sx_button = SizeX(pdtSlider.gcUpOrLeftButton);
  302.     MoveTo(pdtSlider.gcDownOrRightButton,_iSize-sx_button,0);
  303.  
  304.     // Create background texture
  305.     pdtSlider.gcTexture = NewBitmap(smWhite,0);
  306.     SetAlign(pdtSlider.gcTexture,e_GUI_HAlign_Zoom,e_GUI_VAlign_Zoom);
  307.     StretchTo(pdtSlider.gcTexture,(_iSize-(2.0*sx_button+0.5)),2.0*g_fScreenScaleFactor);
  308.     MoveTo(pdtSlider.gcTexture,sx_button,(sy_button/2));
  309.     // Disable texture
  310.     pdtSlider.gcTexture<<Disable();
  311.  
  312.     // Create container with button interface
  313.     pdtSlider.gcSlider = NewSliderH(_pSlide,(_iSize-((2.0*sx_button)+0.5)));
  314.     var f32x fPosY;
  315.     fPosY = (sy_button-SizeY(pdtSlider.gcSlider))/2;
  316.     MoveTo(pdtSlider.gcSlider,sx_button, fPosY);
  317.  
  318.     // Get size of area of index e_GUI_State_Enabled
  319.     sx_slider = SizeX(pdtSlider.gcSlider);
  320.     sy_slider = SizeY(pdtSlider.gcSlider);
  321.  
  322.     MoveTo(pdtSlider.gcSlider,sx_button,(sy_button-sy_slider)/2.0);
  323.  
  324.     // Strech container to area size
  325.     if (sy_slider < sy_button) 
  326.         sy_slider = sy_button;
  327.     StretchTo(composite,_iSize,sy_slider);
  328.  
  329.     // Mount
  330.     MountComponent(composite,pdtSlider.gcUpOrLeftButton);
  331.     MountComponent(composite,pdtSlider.gcDownOrRightButton);
  332.     MountComponent(composite,pdtSlider.gcTexture);
  333.     MountComponent(composite,pdtSlider.gcSlider);
  334.  
  335.     return composite;
  336. }
  337.  
  338. func Gui_Component NewSliderV(Menu_Material _pSlide,i32x _iSize)
  339. {
  340.     var Menu_Sprite sprite;
  341.     var Gui_Component container;
  342.     var Gui_dtSlider pdtSlider;
  343.     var f32x sx,sy,f;
  344.     var i32x iArea;
  345.  
  346.     // Create container with button interface
  347.     container = NewContainer(Gui_iSliderV);
  348.     CatchEvent(container,e_GUI_Event_Mouse_Move);
  349.  
  350.     // Create new data structure
  351.     pdtSlider = new Gui_dtSlider;
  352.     SetData(container,pdtSlider);
  353.  
  354.     // Create a sprite with material and area index e_GUI_State_Enabled
  355.     sprite = NewSprite2D(_pSlide);
  356.     iArea = e_GUI_State_Enabled;
  357.     SetArea(sprite,iArea);
  358.  
  359.     // Get size of area of index e_GUI_State_Enabled
  360.     sx = GetAreaWidth(_pSlide,iArea);
  361.     sy = GetAreaHeight(_pSlide,iArea);
  362.  
  363.     // Init data
  364.     f=_iSize;
  365.     f=f-sy;
  366.     pdtSlider.iSize = f+0.5; // minimum size
  367.     pdtSlider.fMin = 0.0; // minimum value
  368.     pdtSlider.fMax = 1.0; // maximum value
  369.     pdtSlider.fValue = 1.0;
  370.     pdtSlider.fCoef = f/(pdtSlider.fMax-pdtSlider.fMin);
  371.     pdtSlider.fStep = 1.0/pdtSlider.fCoef; // default step
  372.     pdtSlider.bDrag = false;
  373.     pdtSlider.iDragOffset = 0;
  374.     pdtSlider.iSldSize = sy+0.5;
  375.  
  376.     // Strech container to area size
  377.     StretchTo(container,sx,_iSize);
  378.  
  379.     // Define align center/center
  380.     SetAlign(container,e_GUI_HAlign_Center,e_GUI_VAlign_Center);
  381.  
  382.     // Attach the sprite to this container
  383.     AttachSprite(container,sprite);
  384.  
  385.     // init slider position
  386.     container<<SldValue(0.0);
  387.  
  388.     return container;
  389. }
  390.  
  391. /*
  392.  *    Function        : OnGainFocus 
  393.  *    Return            : func must return true to gain focus
  394.  *                      if false is return component doesn't take focus
  395.  *    GuiMessage        : "GainFocus"
  396.  */
  397. func i32x Slider_OnGainFocus()
  398. {
  399.     // Take focus
  400.     return true;
  401. }
  402.  
  403. /*
  404.  *    Function        : OnLoseFocus 
  405.  *    GuiMessage        : "LoseFocus"
  406.  */
  407. func i32x Slider_OnLoseFocus()
  408. {
  409.     var Gui_dtSlider pdtSlider;
  410.     var Gui_Component pthis; 
  411.  
  412.     // Retrieve slider pointer
  413.     pthis = GetThis();
  414.     // Retrieve slider data
  415.     pdtSlider = GetData(pthis);
  416.  
  417.     // Reset drag flag
  418.     pdtSlider.bDrag = false;
  419.     pdtSlider.iDragOffset = 0;
  420. }
  421.  
  422. /*
  423.  *    Function        : Slider set position
  424.  *    Remarks            : _iPosition is pixel offset starting from ruler
  425.  *    Message            : "Position"
  426.  */
  427. func void SliderH_SetPosition(i32x _iPosition)
  428. {
  429.     var Gui_dtSlider pdtSlider;
  430.     var Gui_Component pthis,pparent; 
  431.  
  432.     var i32x i32Value,iCorrectedPos;
  433.     var f32x fValue,fPos,fOldValue;
  434.  
  435.     // Retrieve slider pointer
  436.     pthis = GetThis();
  437.     // Retrieve slider data
  438.     pdtSlider = GetData(pthis);
  439.  
  440.     // Cast position to float
  441.     fPos = _iPosition - (pdtSlider.iSldSize/2);
  442.  
  443.     // Calc value
  444.     fValue = (fPos / pdtSlider.fCoef) + pdtSlider.fMin;
  445.  
  446.     // Change slider pos
  447.     fOldValue = pdtSlider.fValue;
  448.     iCorrectedPos = Slider_iComputePosition(pdtSlider,fValue);
  449.     if(fOldValue != pdtSlider.fValue)
  450.     {
  451.         iCorrectedPos = iCorrectedPos - (pdtSlider.iSize/2);
  452.         SetXHotspot(pthis,iCorrectedPos);
  453.         pparent = GetParent(pthis);
  454.         if(pparent) pparent<<SldChange(pthis,pdtSlider.fValue);
  455.     }
  456. }
  457. func void SliderV_SetPosition(i32x _iPosition)
  458. {
  459.     var Gui_dtSlider pdtSlider;
  460.     var Gui_Component pthis,pparent; 
  461.  
  462.     var i32x i32Value,iCorrectedPos;
  463.     var f32x fValue,fPos,fOldValue;
  464.  
  465.     // Retrieve slider pointer
  466.     pthis = GetThis();
  467.     // Retrieve slider data
  468.     pdtSlider = GetData(pthis);
  469.  
  470.     // Cast position to float
  471.     fPos = _iPosition - (pdtSlider.iSldSize/2);
  472.  
  473.     // Calc value
  474.     fValue = (fPos / pdtSlider.fCoef) + pdtSlider.fMin;
  475.  
  476.     // Change slider pos
  477.     fOldValue = pdtSlider.fValue;
  478.     iCorrectedPos = Slider_iComputePosition(pdtSlider,fValue);
  479.     if(fOldValue != pdtSlider.fValue)
  480.     {
  481.         iCorrectedPos = iCorrectedPos - (pdtSlider.iSize/2);
  482.         SetYHotspot(pthis,iCorrectedPos);
  483.         pparent = GetParent(pthis);
  484.         if(pparent) pparent<<SldChange(pthis,pdtSlider.fValue);
  485.     }
  486. }
  487.  
  488. /*
  489.  *    Function        : return slide pos in pix from value
  490.  *    Remarks            : Test if value is inside min max
  491.  */
  492. func i32x Slider_iComputePosition(Gui_dtSlider _pdtSlider,f32x _fValue)
  493. {
  494.     var f32x fMin,fMax,m,fNewPos;
  495.     var i32x iNewPos;
  496.  
  497.     m=fmod(_fValue,_pdtSlider.fStep);
  498.     fMin = _fValue - m;
  499.     fMax = _fValue + ( _pdtSlider.fStep - m);
  500.  
  501.     if(fabs(_fValue-fMin) > fabs(_fValue-fMax))
  502.         _pdtSlider.fValue = fMax;
  503.     else
  504.         _pdtSlider.fValue = fMin;
  505.     
  506.     if (_pdtSlider.fValue < _pdtSlider.fMin) _pdtSlider.fValue = _pdtSlider.fMin;
  507.     if (_pdtSlider.fValue > _pdtSlider.fMax) _pdtSlider.fValue = _pdtSlider.fMax;
  508.  
  509.     //print("fValue"+ftoa(_pdtSlider.fValue)+"\n");
  510.     fNewPos = ((_pdtSlider.fValue -  _pdtSlider.fMin) * _pdtSlider.fCoef);
  511.     iNewPos = fNewPos+0.5;
  512.  
  513.     return iNewPos;
  514. }
  515. /*
  516.  *    Function        : Slider set value
  517.  *    Remarks            : Test if value is inside min max
  518.  *    Message            : "Value"
  519.  */
  520. func void SliderH_QuietSldValue(f32x _fValue)
  521. {
  522.     var f32x fOldValue;
  523.     var i32x iCorrectedPos;
  524.     var Gui_dtSlider pdtSlider;
  525.     var Gui_Component pthis; 
  526.  
  527.     // Retrieve slider pointer
  528.     pthis = GetThis();
  529.     // Retrieve slider data
  530.     pdtSlider = GetData(pthis);
  531.  
  532.     // Compute slider position
  533.     fOldValue = pdtSlider.fValue;
  534.     if(fOldValue != _fValue)
  535.     {
  536.         iCorrectedPos = Slider_iComputePosition(pdtSlider,_fValue);
  537.         iCorrectedPos = iCorrectedPos - (pdtSlider.iSize/2);
  538.         SetXHotspot(pthis,iCorrectedPos);
  539.     }
  540. }
  541.  
  542.  
  543. /*
  544.  *    Function        : Slider set value
  545.  *    Remarks            : Test if value is inside min max
  546.  *    Message            : "Value"
  547.  */
  548. func void SliderH_SetValue(f32x _fValue)
  549. {
  550.     var Gui_Component pthis,pparent;
  551.     var Gui_dtSlider pdtSlider;
  552.  
  553.     //Change value
  554.     SliderH_QuietSldValue(_fValue);
  555.  
  556.     //send message to parent
  557.     pthis = GetThis();
  558.     pparent = GetParent(pthis);
  559.     pdtSlider = GetData(pthis);
  560.  
  561.     if(pparent)    pparent<<SldChange(pthis,pdtSlider.fValue);
  562. }
  563.  
  564.  
  565. func void SliderV_QuietSldValue(f32x _fValue)
  566. {
  567.     var f32x fOldValue;
  568.     var i32x iCorrectedPos;
  569.     var Gui_dtSlider pdtSlider;
  570.     var Gui_Component pthis; 
  571.  
  572.     // Retrieve slider pointer
  573.     pthis = GetThis();
  574.     // Retrieve slider data
  575.     pdtSlider = GetData(pthis);
  576.  
  577.     // Compute slider position
  578.     fOldValue = pdtSlider.fValue;
  579.     if(fOldValue != _fValue)
  580.     {
  581.         iCorrectedPos = Slider_iComputePosition(pdtSlider,_fValue);
  582.         iCorrectedPos = iCorrectedPos - (pdtSlider.iSize/2);
  583.         SetYHotspot(pthis,iCorrectedPos);
  584.     }
  585. }
  586. func i32x SliderV_OnMouseRoll(i32x _iX,i32x _iY,i32x _iZ)
  587. {
  588.     var Gui_dtSlider pdtSlider;
  589.     var Gui_Component pthis; 
  590.     var f32x pos, sy;
  591.  
  592.     // Retrieve slider pointer
  593.     pthis = GetThis();
  594.     // Retrieve slider data
  595.     pdtSlider = GetData(pthis);
  596.  
  597.     sy = SizeY(pthis);
  598.     pos = GetYHotspot(pthis) + (sy / 2);
  599.  
  600.     pos = pos - (_iZ /12.0);
  601.     pthis<<SldPosition(pos);
  602. }
  603.  
  604.  
  605. func void SliderV_SetValue(f32x _fValue)
  606. {
  607.     var Gui_Component pthis,pparent;
  608.     var Gui_dtSlider pdtSlider;
  609.  
  610.     //Change value
  611.     SliderV_QuietSldValue(_fValue);
  612.  
  613.     //send message to parent
  614.     pthis = GetThis();
  615.     pparent = GetParent(pthis);
  616.     pdtSlider = GetData(pthis);
  617.  
  618.     if(pparent)    pparent<<SldChange(pthis,pdtSlider.fValue);
  619. }
  620.  
  621. /*
  622.  *    Function        : Slider set range and step value
  623.  *    Remarks            : Swap min max if needed
  624.  *    Message            : "Min"
  625.  */
  626. func void Slider_SetParam(f32x _fMin,f32x _fMax,f32x _fStep)
  627. {
  628.     var Gui_dtSlider pdtSlider;
  629.     var Gui_Component pthis; 
  630.     var f32x fSize;
  631.  
  632.     // Retrieve slider pointer
  633.     pthis = GetThis();
  634.     // Retrieve slider data
  635.     pdtSlider = GetData(pthis);
  636.  
  637.     if(_fMax<=_fMin)
  638.     {
  639.         print("SliderWarning:"+ftoa(_fMin)+"-"+ftoa(_fMax)+" Bad range !");
  640.     }
  641.     else
  642.     {
  643.         pdtSlider.fMin = _fMin; // minimum value
  644.         pdtSlider.fMax = _fMax; // maximum value
  645.         fSize = pdtSlider.iSize;
  646.         pdtSlider.fCoef = fSize/(pdtSlider.fMax-pdtSlider.fMin);
  647.         pdtSlider.fStep = _fStep; // default step
  648.     }
  649. }
  650.  
  651. /*
  652.  *    Function        : Slider set pixel width
  653.  *    Remarks            : warning if size to small
  654.  *    Message            : "SldSize"
  655.  */
  656. func void SliderH_SetSize(i32x _iSize)
  657. {
  658.     var Gui_dtSlider pdtSlider;
  659.     var Gui_Component pthis; 
  660.     var f32x fSize,fval;
  661.  
  662.     // Retrieve slider pointer
  663.     pthis = GetThis();
  664.     // Retrieve slider data
  665.     pdtSlider = GetData(pthis);
  666.  
  667.     StretchTo(pthis,_iSize,SizeY(pthis));
  668.  
  669.     if(_iSize<=pdtSlider.iSldSize)
  670.     {
  671.         print("SliderWarning:"+ftoa(_iSize)+" Bad size !");
  672.     }
  673.     else
  674.     {
  675.         fSize = _iSize - pdtSlider.iSldSize;
  676.         pdtSlider.iSize = fSize;
  677.         pdtSlider.fCoef = fSize/(pdtSlider.fMax-pdtSlider.fMin);
  678.         // Update slider position
  679.         fval=pdtSlider.fValue;
  680.         pdtSlider.fValue = pdtSlider.fMin -1.0;
  681.         pthis<<QuietSldValue(fval);
  682.     }
  683. }
  684. func void SliderV_SetSize(i32x _iSize)
  685. {
  686.     var Gui_dtSlider pdtSlider;
  687.     var Gui_Component pthis; 
  688.     var f32x fSize,fval;
  689.  
  690.     // Retrieve slider pointer
  691.     pthis = GetThis();
  692.     // Retrieve slider data
  693.     pdtSlider = GetData(pthis);
  694.  
  695.     StretchTo(pthis,SizeX(pthis),_iSize);
  696.  
  697.     if(_iSize<=pdtSlider.iSldSize)
  698.     {
  699.         print("SliderWarning:"+ftoa(_iSize)+" Bad size !");
  700.     }
  701.     else
  702.     {
  703.         fSize = _iSize - pdtSlider.iSldSize;
  704.         pdtSlider.iSize = fSize;
  705.         pdtSlider.fCoef = fSize/(pdtSlider.fMax-pdtSlider.fMin);
  706.         // Update slider position
  707.         fval=pdtSlider.fValue;
  708.         pdtSlider.fValue = pdtSlider.fMin -1.0;
  709.         pthis<<QuietSldValue(fval);
  710.     }
  711. }
  712.  
  713. /*
  714.  *    Function        : OnMouseUp 
  715.  *    Parameters        : _iX : absolute mouse x position
  716.  *    Parameters        : _iY : absolute mouse y position
  717.  *    Parameters        : _iButton : index of button
  718.  *    GuiMessage        : "MouseUp"
  719.  */
  720. func i32x Slider_OnMouseUp(i32x _iX,i32x _iY,i32x _iButton)
  721. {
  722.     var Gui_dtSlider pdtSlider;
  723.     var Gui_Component pthis; 
  724.  
  725.     if(_iButton == e_Gui_Mouse_Left_Button)
  726.     {
  727.         // Retrieve slider pointer
  728.         pthis = GetThis();
  729.         // Retrieve slider data
  730.         pdtSlider = GetData(pthis);
  731.  
  732.         // Reset drag flag
  733.         pdtSlider.bDrag = false;
  734.         pdtSlider.iDragOffset = 0;
  735.     }
  736. }
  737.  
  738. /*
  739.  *    Function        : OnMouseDown 
  740.  *    Parameters        : _iX : absolute mouse x position
  741.  *    Parameters        : _iY : absolute mouse y position
  742.  *    Parameters        : _iButton : index of button
  743.  *    GuiMessage        : "MouseDown"
  744.  */
  745. func i32x SliderH_OnMouseDown(i32x _iX,i32x _iY,i32x _iButton)
  746. {
  747.     var Gui_dtSlider pdtSlider;
  748.     var Gui_Component pthis; 
  749.     var i32x x,bmin,bmax;
  750.     if(_iButton == e_Gui_Mouse_Left_Button)
  751.     {
  752.         // Retrieve slider pointer
  753.         pthis = GetThis();
  754.         // Retrieve slider data
  755.         pdtSlider = GetData(pthis);
  756.         // Active drag
  757.         pdtSlider.bDrag = true;
  758.         // Get click position to get reference position
  759.         x = _iX - AbsPosX(pthis);
  760.         //
  761.         bmin = GetXHotspot(pthis)+(pdtSlider.iSize/2);
  762.         bmax = bmin + pdtSlider.iSldSize;
  763.         if((x<=bmax)&&(x>=bmin))
  764.         {
  765.             // Click on the slider
  766.             // keep offset between slider center
  767.             pdtSlider.iDragOffset = x-(bmin+(pdtSlider.iSldSize/2));
  768.         }
  769.         else
  770.         {
  771.             // Click on the ruler : 0 offset
  772.             pdtSlider.iDragOffset = 0;
  773.             // Move slide and value correspondant to click position
  774.             SliderH_SetPosition(x);
  775.         }
  776.     }
  777. }
  778. func i32x SliderV_OnMouseDown(i32x _iX,i32x _iY,i32x _iButton)
  779. {
  780.     var Gui_dtSlider pdtSlider;
  781.     var Gui_Component pthis; 
  782.     var i32x y,bmin,bmax;
  783.     if(_iButton == e_Gui_Mouse_Left_Button)
  784.     {
  785.         // Retrieve slider pointer
  786.         pthis = GetThis();
  787.         // Retrieve slider data
  788.         pdtSlider = GetData(pthis);
  789.         // Active drag
  790.         pdtSlider.bDrag = true;
  791.         // Get click position to get reference position
  792.         y = _iY - AbsPosY(pthis);
  793.         //
  794.         bmin = GetYHotspot(pthis)+(pdtSlider.iSize/2);
  795.         bmax = bmin + pdtSlider.iSldSize;
  796.         if((y<=bmax)&&(y>=bmin))
  797.         {
  798.             // Click on the slider
  799.             // keep offset between slider center
  800.             pdtSlider.iDragOffset = y-(bmin+(pdtSlider.iSldSize/2));
  801.         }
  802.         else
  803.         {
  804.             // Click on the ruler : 0 offset
  805.             pdtSlider.iDragOffset = 0;
  806.             // Move slide and value correspondant to click position
  807.             SliderV_SetPosition(y);
  808.         }
  809.     }
  810. }
  811.  
  812. /*
  813.  *    Function        : OnMouseMove 
  814.  *    Parameters        : _iX : absolute mouse x position
  815.  *    Parameters        : _iY : absolute mouse y position
  816.  *    GuiMessage        : "MouseDown"
  817.  */
  818. func i32x SliderH_OnMouseMove(i32x _iX,i32x _iY)
  819. {
  820.     var Gui_dtSlider pdtSlider;
  821.     var Gui_Component pthis;
  822.     var i32x x,offset;
  823.     // Retrieve slider pointer
  824.     pthis = GetThis();
  825.     // Retrieve slider data
  826.     pdtSlider = GetData(pthis);
  827.     if(pdtSlider.bDrag == true)
  828.     {
  829.         // Get click position to get reference position
  830.         x = _iX - AbsPosX(pthis);
  831.         // Move slide and value correspondant to click position
  832.         SliderH_SetPosition(x-pdtSlider.iDragOffset);
  833.     }
  834. }
  835. func void Slider_OnEnter(i32x _iX,i32x _iY)
  836. {
  837.     var Gui_Component pthis;
  838.     var Menu_Sprite sprite;
  839.  
  840.     pthis = GetThis();
  841.  
  842.     sprite = GetSprite(pthis);
  843.     SetArea(sprite,e_GUI_State_Focus);
  844. }
  845. func void Slider_OnLeave(i32x _iX,i32x _iY)
  846. {
  847.     var Gui_Component pthis;
  848.     var Menu_Sprite sprite;
  849.  
  850.     pthis = GetThis();
  851.  
  852.     sprite = GetSprite(pthis);
  853.     SetArea(sprite,e_GUI_State_Enabled);
  854. }
  855. func i32x SliderV_OnMouseMove(i32x _iX,i32x _iY)
  856. {
  857.     var Gui_dtSlider pdtSlider;
  858.     var Gui_Component pthis;
  859.     var i32x y,offset;
  860.     // Retrieve slider pointer
  861.     pthis = GetThis();
  862.     // Retrieve slider data
  863.     pdtSlider = GetData(pthis);
  864.     if(pdtSlider.bDrag == true)
  865.     {
  866.         // Get click position to get reference position
  867.         y = _iY - AbsPosY(pthis);
  868.         // Move slide and value correspondant to click position
  869.         SliderV_SetPosition(y-pdtSlider.iDragOffset);
  870.     }
  871. }
  872.  
  873. func void SliderComposite_SldChange(Gui_Component _pthis,f32x _fValue)
  874. {
  875.     var Gui_Component pthis, parent;
  876.  
  877.     pthis = GetThis();
  878.     parent = GetParent(pthis);
  879.  
  880.     parent<<SldChange(pthis,_fValue);
  881. }
  882.  
  883. func i32x SliderCompositeV_OnClickDown(Gui_Component _pComponent)
  884. {
  885.     var Gui_Component pthis; 
  886.     var Gui_dtSliderComposite pdtSlider;
  887.  
  888.     pthis = GetThis();
  889.     pdtSlider = GetData(pthis);
  890.     
  891.     // booleen permettant de savoir que le bouton de la souris est enfoncee
  892.     pdtSlider.bMouseDown = true;
  893.     
  894.     // calcul du deplacement
  895.     if (_pComponent == pdtSlider.gcUpOrLeftButton)
  896.     {
  897.             pdtSlider.fMove = -10.0*g_fScreenScaleFactor;
  898.     }
  899.     if (_pComponent == pdtSlider.gcDownOrRightButton)
  900.     {
  901.             pdtSlider.fMove = 10.0*g_fScreenScaleFactor;
  902.     }
  903.  
  904.     // update interface
  905.     SetInterface(pthis,Gui_iSliderCompositeV_Loop);
  906. }
  907.  
  908. func i32x SliderCompositeH_OnClickDown(Gui_Component _pComponent)
  909. {
  910.     var Gui_Component pthis; 
  911.     var Gui_dtSliderComposite pdtSlider;
  912.  
  913.     pthis = GetThis();
  914.     pdtSlider = GetData(pthis);
  915.  
  916.     // booleen permettant de savoir que le bouton de la souris est enfoncee
  917.     pdtSlider.bMouseDown = true;
  918.  
  919.     // change slider
  920.     // SetArea(GetSprite(pdtSlider.gcSlider), 1);
  921.  
  922.     // calcul du deplacement
  923.     if (_pComponent == pdtSlider.gcUpOrLeftButton)
  924.     {
  925.             pdtSlider.fMove =  -10.0*g_fScreenScaleFactor;
  926.     }
  927.     if (_pComponent == pdtSlider.gcDownOrRightButton)
  928.     {
  929.             pdtSlider.fMove = 10.0*g_fScreenScaleFactor;
  930.     }
  931.  
  932.     // update interface
  933.     SetInterface(pthis,Gui_iSliderCompositeH_Loop);
  934. }
  935.  
  936. func i32x SliderCompositeH_OnLoop(f32x _fDelta)
  937. {
  938.     var Gui_Component pthis; 
  939.     var Gui_dtSliderComposite pdtSlider;
  940.     var f32x pos, sx;
  941.  
  942.     pthis = GetThis();
  943.     pdtSlider = GetData(pthis);
  944.  
  945.     sx = SizeX(pdtSlider.gcSlider);
  946.     pos = GetXHotspot(pdtSlider.gcSlider) + (sx / 2);
  947.  
  948.     // if mouse down
  949.     if (pdtSlider.bMouseDown == true)
  950.     {
  951.         pdtSlider.gcSlider<<SldPosition(pos + pdtSlider.fMove);
  952.     }
  953. }
  954.  
  955. func i32x SliderCompositeV_OnLoop(f32x _fDelta)
  956. {
  957.     var Gui_Component pthis; 
  958.     var Gui_dtSliderComposite pdtSlider;
  959.     var f32x pos, sy;
  960.  
  961.     pthis = GetThis();
  962.     pdtSlider = GetData(pthis);
  963.  
  964.     sy = SizeY(pdtSlider.gcSlider);
  965.     pos = GetYHotspot(pdtSlider.gcSlider) + (sy / 2);
  966.  
  967.     // if mouse down
  968.     if (pdtSlider.bMouseDown == true)
  969.     {
  970.         pdtSlider.gcSlider<<SldPosition(pos + pdtSlider.fMove);
  971.     }
  972. }
  973.  
  974. func void SliderCompositeH_OnMouseUp(Gui_Component _pComponent)
  975. {
  976.     var Gui_Component pthis; 
  977.     var Gui_dtSliderComposite pdtSlider;
  978.  
  979.     pthis = GetThis();
  980.     pdtSlider = GetData(pthis);
  981.  
  982.     pdtSlider.bMouseDown = false;
  983.  
  984.     // update interface
  985.     SetInterface(pthis,Gui_iSliderCompositeH);
  986. }
  987.  
  988. func void SliderCompositeV_OnMouseUp(Gui_Component _pComponent)
  989. {
  990.     var Gui_Component pthis; 
  991.     var Gui_dtSliderComposite pdtSlider;
  992.  
  993.     pthis = GetThis();
  994.     pdtSlider = GetData(pthis);
  995.  
  996.     pdtSlider.bMouseDown = false;
  997.  
  998.     // update interface
  999.     SetInterface(pthis,Gui_iSliderCompositeV);
  1000. }
  1001.  
  1002. func void SliderCompositeH_SetSize(i32x _iSize)
  1003. {
  1004.     var Gui_Component pthis; 
  1005.     var Gui_dtSliderComposite pdtSlider;
  1006.     var f32x sx,sy, sx_newsize;
  1007.  
  1008.     pthis = GetThis();
  1009.     pdtSlider = GetData(pthis);
  1010.  
  1011.     // send mesg to slider with new size
  1012.     sx = SizeX(pdtSlider.gcUpOrLeftButton);
  1013.     sx_newsize = _iSize-(sx*2.0);
  1014.     pdtSlider.gcSlider<<SldSize(sx_newsize);
  1015.  
  1016.     // move button
  1017.     MoveTo(pdtSlider.gcDownOrRightButton,_iSize-sx,0);
  1018.  
  1019.     // stretch texture
  1020.     sy = SizeY(pthis);
  1021.     StretchTo(pdtSlider.gcTexture,sx_newsize,2);
  1022.     // stretch slider composite
  1023.     StretchTo(pthis,_iSize,sy);
  1024. }
  1025.  
  1026. func void SliderCompositeV_SetSize(i32x _iSize)
  1027. {
  1028.     var Gui_Component pthis; 
  1029.     var Gui_dtSliderComposite pdtSlider;
  1030.     var f32x sx,sy, sy_newsize;
  1031.  
  1032.     pthis = GetThis();
  1033.     pdtSlider = GetData(pthis);
  1034.  
  1035.     // send mesg to slider with new size
  1036.     sy = SizeY(pdtSlider.gcUpOrLeftButton);
  1037.     sy_newsize = _iSize-(sy*2.0);
  1038.     pdtSlider.gcSlider<<SldSize(sy_newsize);
  1039.  
  1040.     // move button
  1041.     MoveTo(pdtSlider.gcDownOrRightButton,0,_iSize-sy);
  1042.  
  1043.     // stretch texture
  1044.     sx = SizeX(pthis);
  1045.     StretchTo(pdtSlider.gcTexture,2,sy_newsize);
  1046.     // stretch slider composite
  1047.     StretchTo(pthis,sx,_iSize);
  1048. }
  1049.